//========= Copyright Valve Corporation ============//
#include "dirtools_public.h"
#include "strtools_public.h"
#include "pathtools_public.h"

#include <errno.h>
#include <string.h>

#ifdef _WIN32
#include "windows.h"
#else
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#endif

#if defined( OSX )
#include <sys/syslimits.h>
#endif


//-----------------------------------------------------------------------------
// Purpose: utility function to create dirs & subdirs
//-----------------------------------------------------------------------------
bool BCreateDirectoryRecursive(const char* pchPath)
{
	// Does it already exist?
	if (Path_IsDirectory(pchPath))
		return true;

	// copy the path into something we can munge
	int len = (int)strlen(pchPath);
	char* path = (char*)malloc(len + 1);
	strcpy(path, pchPath);

	// Walk backwards to first non-existing dir that we find
	char* s = path + len - 1;

	const char slash = Path_GetSlash();
	while (s > path)
	{
		if (*s == slash)
		{
			*s = '\0';
			bool bExists = Path_IsDirectory(path);
			*s = slash;

			if (bExists)
			{
				++s;
				break;
			}
		}
		--s;
	}

	// and then move forwards from there

	while (*s)
	{
		if (*s == slash)
		{
			*s = '\0';
			BCreateDirectory(path);
			*s = slash;
		}
		s++;
	}

	bool bRetVal = BCreateDirectory(path);
	free(path);
	return bRetVal;
}


//-----------------------------------------------------------------------------
// Purpose: Creates the directory, returning true if it is created, or if it already existed
//-----------------------------------------------------------------------------
bool BCreateDirectory(const char* pchPath)
{
#ifdef WIN32
	std::wstring wPath = UTF8to16(pchPath);
	if (::CreateDirectoryW(wPath.c_str(), NULL))
		return true;

	if (::GetLastError() == ERROR_ALREADY_EXISTS)
		return true;

	return false;
#else
	int i = mkdir(pchPath, S_IRWXU | S_IRWXG | S_IRWXO);
	if (i == 0)
		return true;
	if (errno == EEXIST)
		return true;

	return false;
#endif
}